package com.zbj.homemade.spring.beans;

import com.zbj.homemade.spring.annotation.Bean;
import com.zbj.homemade.spring.annotation.ComponentScan;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * |                    .  ’   *   ‘  .
 * |               _6                    "     o0000o
 * |  o00o _    .%                         %. o0000000o
 * | o000000o.:                              :(0000000o
 * | o00000os                                  .000000o
 * |  o0000/     <b>不了不了,改需求真的伤身体</>   .000o
 * |    o0o                                       .0o
 * |     y        <b>我认为源代码,就是SkrSkr</>     .
 * |    y                                           ,
 * |   y          <b>小熊猫保佑,代码永不修改</>        ,
 * |   p                            .                 .
 * |   p                           @@.                .
 * |    y                        ;@@@;               .
 * |    \                       ;@@@@;.@.          ,;S
 * |     、                     .@@@@@@;       ,@@@@@
 * |     @\.            .****...*@@@@;     .@@@@@@@@@@@.
 * |    @@@@\.     . @@@@@@@@@@@@@@@;    .@@@@@@@@@@@@@@@.
 * |   @@@@@@@@@.@@@@@@@@@@@@@@@@;   .@@@@@@@@@@@@@@@@@@@@@.
 * |  @@@@@@..@@@@..@@@@@@..@@@@@ .@@...@@@@@..@@..@@@@@..@@.
 * | @@@@@@@@..@..@@@@@@@@@@@@@;.@@@..@..@@@..@@....@@@..@@@@.
 * |@y@@@@@@@@..@@@@@@@@..@@@@i@@@@..@@@..@..@@..@@..@..@@@@n@.
 * |@n@@@@@@@..@@@@@@@@..@@@@@@@@@..@@@@@...@@..@@@@...@@@@@n@@.
 * |@@@@@@@@..@@@@@@@@..@@@@@@@@@..@@@@@@@.@@..@@@@@..@@@@@@@@@@.
 * |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
 *
 * @program: principle
 * @description:
 * @author: Yinn
 * @create: 2019-03-04 09:26
 **/
public class ConfigurationBeanDefinition extends SimpleBeanDefinition {

    /**
     * basePackages
     */
    private String[] componentScanPaths;

    /**
     * name -> beanDefinition
     */
    private ConcurrentMap<String, BeanAnnotationBeanDefinition> beans = new ConcurrentHashMap<>();

    public ConfigurationBeanDefinition(Class<?> beanClass) {
        super(beanClass);

        //扫描注解
        ComponentScan componentScan = beanClass.getAnnotation(ComponentScan.class);
        if (componentScan != null)
            componentScanPaths = componentScan.basePackages();

        //bean注解
        for (Method m : beanClass.getMethods()) {
            Bean b = m.getAnnotation(Bean.class);

            if (b != null) {

                String name = b.name();

                if (StringUtils.isBlank(name))
                    name = m.getName();


                BeanAnnotationBeanDefinition babd = new BeanAnnotationBeanDefinition(m.getReturnType(), m, beanClass);

                beans.put(name, babd);

            }
        }
    }

    public boolean hasBeanAnnotatedBeanDefinitions() {
        return this.beans.size() > 0;
    }

    public ConcurrentMap<String, BeanAnnotationBeanDefinition> getBeans() {
        return this.beans;
    }


    public boolean hasComponentScanPath() {
        return componentScanPaths != null && componentScanPaths.length > 0;
    }

    public String[] getComponentScanPath() {
        return componentScanPaths;
    }
}
